// cli-controller.js
const readline = require('readline');
const fs = require('fs');
const path = require('path');
const { changeWallpaper } = require('./wallpaper-manager');
const { exec } = require('child_process');

// 配置文件路径
const configPath = path.join(__dirname, 'config.js');

// 默认配置
let config = {
  folderPath: '',
  interval: 300 // 默认5分钟
};

// 定时器变量
let wallpaperInterval = null;
let isLocked = false; // 锁屏状态标志

// 读取配置文件
function loadConfig() {
  try {
    if (fs.existsSync(configPath)) {
      delete require.cache[require.resolve(configPath)]; // 清除缓存
      const configModule = require(configPath);
      config = { ...config, ...configModule };
    }
  } catch (err) {
    console.error('读取配置文件失败:', err.message);
  }
}

// 保存配置到文件
function saveConfig() {
  const configContent = `module.exports = ${JSON.stringify(config, null, 2)};`;
  try {
    fs.writeFileSync(configPath, configContent, 'utf8');
    console.log('配置已保存到 config.js');
  } catch (err) {
    console.error('保存配置失败:', err.message);
  }
}

// 设置定时更换壁纸
function setupWallpaperChanger() {
  // 取消之前的定时任务
  if (wallpaperInterval) {
    clearInterval(wallpaperInterval);
    wallpaperInterval = null;
  }

  // 如果有设置文件夹路径，则设置定时任务
  if (config.folderPath && fs.existsSync(config.folderPath)) {
    // 只在未锁屏时启动定时器
    if (!isLocked) {
      wallpaperInterval = setInterval(async () => {
        try {
          const newWallpaperPath = await changeWallpaper(config.folderPath);
        } catch (err) {
          console.error('更换壁纸失败:', err.message);
        }
      }, config.interval * 1000);
    }
  } else if (config.folderPath) {
    console.log('壁纸文件夹路径不存在，请检查路径是否正确');
  }
}

// 清理定时器
function clearWallpaperChanger() {
  if (wallpaperInterval) {
    clearInterval(wallpaperInterval);
    wallpaperInterval = null;
  }
}

// 检查Windows锁屏状态
function checkLockStatus() {
  return new Promise((resolve) => {
    // 使用Windows命令检查锁屏状态
    exec('powershell.exe -Command "Get-Process LogonUI -ErrorAction SilentlyContinue"', (error, stdout) => {
      // 如果LogonUI进程存在，说明系统处于锁屏或登录界面
      const isLogonUIRunning = !error && stdout.trim() !== '';
      
      // 同时检查是否存在锁屏应用
      exec('powershell.exe -Command "Get-Process LockApp -ErrorAction SilentlyContinue"', (error2, stdout2) => {
        const isLockAppRunning = !error2 && stdout2.trim() !== '';
        
        resolve(isLogonUIRunning || isLockAppRunning);
      });
    });
  });
}

// 监听锁屏状态变化
function startLockStatusMonitor() {
  // 每隔1秒检查一次锁屏状态
  setInterval(async () => {
    try {
      const locked = await checkLockStatus();
      
      if (locked && !isLocked) {
        isLocked = true;
        console.log('系统已锁屏，壁纸更换已暂停');
        // 锁屏时清除定时器
        clearWallpaperChanger();
      } else if (!locked && isLocked) {
        isLocked = false;
        console.log('系统已解锁，壁纸更换已恢复');
        // 解锁时重新设置定时器
        setupWallpaperChanger();
      }
    } catch (err) {
      // 忽略检查错误
    }
  }, 1000);
}

// 处理 change 命令
function handleChangeCommand(folderPath) {
  if (!folderPath) {
    console.log('请提供壁纸文件夹路径');
    return;
  }

  if (!fs.existsSync(folderPath)) {
    console.log('指定的文件夹不存在');
    return;
  }

  config.folderPath = folderPath;
  console.log(`壁纸文件夹已设置为: ${folderPath}`);
  saveConfig();
  setupWallpaperChanger();
}

// 处理 time 命令
function handleTimeCommand(seconds) {
  if (!seconds) {
    console.log('请提供时间间隔（秒）');
    return;
  }

  const interval = parseInt(seconds);
  if (isNaN(interval) || interval <= 0) {
    console.log('时间间隔必须是正整数');
    return;
  }

  config.interval = interval;
  console.log(`更换壁纸间隔已设置为: ${interval} 秒`);
  saveConfig();
  setupWallpaperChanger();
}

// 处理 refresh 命令
async function handleRefreshCommand() {
  if (!config.folderPath) {
    console.log('请先设置壁纸文件夹路径');
    return;
  }

  if (!fs.existsSync(config.folderPath)) {
    console.log('壁纸文件夹路径不存在');
    return;
  }

  // 即使在锁屏状态下也允许手动刷新
  try {
    const newWallpaperPath = await changeWallpaper(config.folderPath);
  } catch (err) {
    console.error('更换壁纸失败:', err.message);
  }
}

// 解析命令
async function parseCommand(line) {
  const parts = line.trim().split(' ');
  const command = parts[0].toLowerCase();
  
  switch (command) {
    case 'change':
      const folderPath = parts.slice(1).join(' ');
      handleChangeCommand(folderPath);
      break;
      
    case 'time':
      const seconds = parts[1];
      handleTimeCommand(seconds);
      break;
      
    case 'refresh':
      await handleRefreshCommand();
      break;
      
    case 'quit':
    case 'exit':
      console.log('程序退出');
      process.exit(0);
      break;
      
    case '':
      // 空命令，不处理
      break;
      
    default:
      console.log(`未知命令: ${command}`);
      console.log('可用命令:');
      console.log('  change [壁纸文件夹路径]  - 设置壁纸文件夹');
      console.log('  time [秒]               - 设置更换间隔');
      console.log('  refresh                 - 立即更换壁纸');
      console.log('  exit/quit               - 退出程序');
  }
}

// 初始化
function init() {
  loadConfig();
  setupWallpaperChanger();
  startLockStatusMonitor(); // 启动锁屏状态监听
  
  // 创建 readline 接口
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: '> '
  });

  console.log('壁纸更换器控制台');
  console.log('可用命令:');
  console.log('  change [壁纸文件夹路径]  - 设置壁纸文件夹');
  console.log('  time [秒]               - 设置更换间隔');
  console.log('  refresh                 - 立即更换壁纸');
  console.log('  exit/quit               - 退出程序');
  console.log('\n ');
  console.log('壁纸文件夹：', config.folderPath);
  console.log('自动更换时间：', config.interval ,' 秒');
  //如果没有路径 提示输入 字体颜色为黄色
  if (!config.folderPath) {
    console.log('\n\n\x1b[33m请设置壁纸文件夹路径\x1b[0m');
  }

  
  rl.prompt();

  // 监听输入
  rl.on('line', async (line) => {
    await parseCommand(line);
    rl.prompt();
  }).on('close', () => {
    console.log('程序退出');
    // 清理定时器
    if (wallpaperInterval) {
      clearInterval(wallpaperInterval);
    }
    process.exit(0);
  });
}

// 启动程序
init();